package com.mao.proxy;

import com.mao.proxy.dynamicproxy.AliSmsService;
import com.mao.proxy.dynamicproxy.CallService;
import com.mao.proxy.dynamicproxy.SmsProxyHandler;

import java.lang.reflect.Proxy;

public class DynamicProxy {

    public static void main(String[] args) {
        testJDKDynamicProxy();
    }
    /**
     * JDK动态代理只能代理实现了接口的类，并且只能代理接口中的方法。生成的代理类时继承自Proxy又因java是单继承。
     * 所以只能代理接口的实现类。
     */
    private static void testJDKDynamicProxy(){
        //定义需要代理的类对象
        CallService smsService = new AliSmsService();
        Class<? extends CallService> clazz = smsService.getClass();
        System.out.println(clazz); //com.mao.proxy.dynamicproxy.AliSmsService
       // 代理操作类，可以实现代理类方法的增强 例如 在执行方法前后插入操作
        SmsProxyHandler smsProxyHandler = new SmsProxyHandler(smsService);
        // 通过Proxy.newProxyInstance 方法获得代理类
        CallService service = (CallService) Proxy.newProxyInstance(smsService.getClass().getClassLoader(), smsService.getClass().getInterfaces(), smsProxyHandler);
        System.out.println(service.getClass()); //com.sun.proxy.$Proxy0 搭理类默认类名
//        service.send("123456");
        service.call("456789"); //通过代理类调用目标类中的方法
    }


}
